From: vincent@cubedesigners.com Date: Wed, 14 Oct 2020 16:32:24 +0000 (+0000) Subject: wip #3931 @3 X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=153d10194f536ba2d7725100094d3594454460a6;p=cubeextranet.git wip #3931 @3 --- 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 0eb99eb9f..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/src/as3compile and /dev/null differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/as3compile.1 b/fluidbook/tools/swftools-special-swfdump/src/as3compile.1 deleted file mode 100644 index cb207e414..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/as3compile.1 +++ /dev/null @@ -1,91 +0,0 @@ -.TH as3compile "1" "April 2009" "as3compile" "swftools" -.SH NAME -as3compile - Compile .as ActionScript 3.0 files to swf. - -.SH Synopsis -.B as3compile file.as [-o file.swf] - -.SH DESCRIPTION -Compiles a file written in ActionScript 3.0 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\-v\fR, \fB\-\-verbose\fR - Increase verbosity -.TP -\fB\-q\fR, \fB\-\-quiet\fR - Decrease verbosity -.TP -\fB\-C\fR, \fB\-\-cgi\fR - Output to stdout (for use in CGI environments) -.TP -\fB\-R\fR, \fB\-\-resolve\fR - This flag will cause the compiler to try filenames like "FooBar.as" for classes named "FooBar". -.TP -\fB\-D\fR, \fB\-\-define\fR \fInamespace::variable\fR - Set a compile time variable (for doing conditional compilation) -.TP -\fB\-X\fR, \fB\-\-width\fR - Set target SWF width -.TP -\fB\-Y\fR, \fB\-\-height\fR - Set target SWF width -.TP -\fB\-r\fR, \fB\-\-rate\fR - Set target SWF framerate -.TP -\fB\-M\fR, \fB\-\-mainclass\fR - Set the name of the main class (extending flash.display.MovieClip) -.TP -\fB\-l\fR, \fB\-\-library\fR \fIfile\fR - Include library file \fIfile\fR. 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 ef8e4c8aa..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/src/font2swf and /dev/null differ 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 5978542d3..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/src/jpeg2swf and /dev/null differ 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 ecfd6137a..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/src/pdf2swf and /dev/null differ 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 9b1c4c441..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/src/png2swf and /dev/null differ 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 097890b6d..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/src/swfbbox and /dev/null differ 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 7f2b7f918..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/src/swfbytes and /dev/null differ 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 35540d087..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/src/swfc and /dev/null differ 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 22e1ca729..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/src/swfcombine and /dev/null differ 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 71a51ed9c..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/src/swfdump and /dev/null differ 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 d3e91b20b..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/src/swfextract and /dev/null differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfextract.1 b/fluidbook/tools/swftools-special-swfdump/src/swfextract.1 deleted file mode 100644 index 8fb04efce..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfextract.1 +++ /dev/null @@ -1,61 +0,0 @@ -.TH swfextract "1" "January 2003" "swfdump" "swftools" -.SH NAME -swfextract - a tool for extracting data out of swf files. -.SH Synopsis -.B swfextract -[\fIoptions\fR] [\fIfile.swf\fR] -.SH DESCRIPTION -swfextracts allows to extract swf movieclips and objects out of swf files. -.PP -SWF files are animation files which can be displayed in Web Browsers using -the Flash Plugin. -.SH OPTIONS -.TP -\fB\-h\fR, \fB\-\-help\fR -Print short help message and exit -.TP -\fB\-o\fR, \fB\-\-output\fR \fIfilename\fR -Write output to file \fIfilename\fR -.TP -\fB\-V\fR, \fB\-\-version\fR -Print version info and exit -.TP -\fB\-i\fR, \fB\-\-id\fR \fIids\fR -\fIids\fR is a range of IDs to extract. E.g. 1-10,14 -.TP -\fB\-j\fR, \fB\-\-jpegs\fR \fIids\fR -\fIids\fR is a range of JPEG IDs to extract. E.g. 1-2,3,14- -.TP -\fB\-p\fR, \fB\-\-pngs\fR \fIids\fR -\fIids\fR is a range of PNG IDs to extract. E.g. -10,20-30 -.TP -\fB\-f\fR, \fB\-\-frame\fR \fIframes\fR -\fIframes\fR is a range of frames to extract. E.g. 1-10,20-30,40- -.TP -\fB\-n\fR, \fB\-\-name\fR \fIname\fR -Set the name of the object to extract to \fIname\fR. -.TP -\fB\-w\fR, \fB\-\-hollow\fR -Copy empty frames to the output file, too. -.TP -\fB\-P\fR, \fB\-\-placeobject\fR -Copy original placeobject tag for the given object into the -output file (Use with -i). This means that the object is -at the same position in the generated movie as in the -original movie. -.TP -\fB\-j\fR, \fB\-\-jpegs\fR \fIrange\fR -Extract jpeg pictures in \fIrange\fR -.TP -\fB\-p\fR, \fB\-\-pngs\fR \fIrange\fR -Extract png pictures in \fIrange\fR -.TP -\fB\-m\fR, \fB\-\-mp3\fR -Extract main mp3 stream (There may be substreams in the -Movieclips, as well. To extract these, first extract the -Movieclips with \fB-i\fR and then use \fB-m\fR) - -.SH AUTHOR - -Matthias Kramm - 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 1db7135c1..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/src/swfrender and /dev/null differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfrender.1 b/fluidbook/tools/swftools-special-swfdump/src/swfrender.1 deleted file mode 100644 index e69de29bb..000000000 diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfrender.c b/fluidbook/tools/swftools-special-swfdump/src/swfrender.c deleted file mode 100644 index 87a8b32ad..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfrender.c +++ /dev/null @@ -1,199 +0,0 @@ -#include "../config.h" -#include -#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 610902da8..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/src/swfstrings and /dev/null differ 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 79c23ece8..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/src/ttftool and /dev/null differ 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 e03eff55e..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/src/wav2swf and /dev/null differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/wav2swf.1 b/fluidbook/tools/swftools-special-swfdump/src/wav2swf.1 deleted file mode 100644 index c83768055..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/wav2swf.1 +++ /dev/null @@ -1,53 +0,0 @@ -.TH wav2swf "1" "April 2009" "wav2swf" "swftools" -.SH NAME -wav2swf - convert a WAV file to an SWF animation. - -.SH Synopsis -.B wav2swf [-o filename] file.wav - -.SH DESCRIPTION -Takes a wav file and converts it to a swf movie. - -.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 \fIfilename\fR - Explicitly specify output file. (Otherwise, output will go to output.swf) -.TP -\fB\-r\fR, \fB\-\-framerate\fR \fIfps\fR - Set file framerate to \fIfps\fR frames per second. -.TP -\fB\-s\fR, \fB\-\-samplerate\fR \fIsps\fR - Set samplerate to \fIsps\fR frames per second (default: 11025). -.TP -\fB\-d\fR, \fB\-\-definesound\fR - Store the sound as DEFINESOUND tag, not as streaming sound. Allows for - looping. -.TP -\fB\-l\fR, \fB\-\-loop\fR n - Loop the sound n times. -.TP -\fB\-C\fR, \fB\-\-cgi\fR - For use as CGI- prepend http header, write to stdout. -.TP -\fB\-S\fR, \fB\-\-stop\fR - Stop the movie at frame 0, and start the sound at 1, so that the - sound will not play until a "GotoFrame(1)" is issued. - (For use with flashsound.js). -.TP -\fB\-E\fR, \fB\-\-end\fR - Stop the movie at the end frame -.TP -\fB\-b\fR, \fB\-\-bitrate\fR \fIbps\fR - Set mp3 bitrate to \fIbps\fR (default: 32) -.TP -\fB\-v\fR, \fB\-\-verbose\fR - Be more verbose. (Use more than one -v for greater effect) -.SH AUTHOR - -Matthias Kramm 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 8237fc74d..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate and /dev/null differ 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 afe81349a..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.swf and /dev/null differ diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer b/fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer deleted file mode 100644 index 6e5bcc61e..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer and /dev/null differ diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer.c b/fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer.c deleted file mode 100644 index 1a81ca1f1..000000000 --- a/fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer.c +++ /dev/null @@ -1,214 +0,0 @@ -/* keyboard_viewer.c - - Creates the swf file keyboard_viewer.swf. - This can be used to navigate through frames using the keyboard (space, - cursor left, cursor right) - Notice that the movie has to clicked with the mouse once to get - navigation activated in most browsers. - - 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; - -#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 3022b28e0..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer.swf and /dev/null differ 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 1862ee73b..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/swfs/rfxview.swf and /dev/null differ diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer b/fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer deleted file mode 100644 index 83781dfe7..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer and /dev/null differ 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 579096d25..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer.swf and /dev/null differ diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/swft_loader.swf b/fluidbook/tools/swftools-special-swfdump/swfs/swft_loader.swf deleted file mode 100644 index d5ebc31cc..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/swfs/swft_loader.swf and /dev/null differ 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 327f992d1..000000000 Binary files a/fluidbook/tools/swftools-special-swfdump/swfs/tessel_loader.swf and /dev/null differ 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